Unit Testing এবং Integration Testing

Web Development - অ্যাঙ্গুলার গুগল চার্ট (Angular Google Charts) - Testing এবং Debugging (টেস্টিং এবং ডিবাগিং) |

Unit Testing এবং Integration Testing হল সফটওয়্যার ডেভেলপমেন্টের দুইটি গুরুত্বপূর্ণ টেস্টিং প্রক্রিয়া, যা কোডের বৈধতা যাচাই এবং বিভিন্ন সিস্টেমের কার্যক্ষমতা নিশ্চিত করতে ব্যবহৃত হয়। এগুলোর মধ্যে পার্থক্য এবং কিভাবে Angular অ্যাপ্লিকেশনে এগুলি প্রয়োগ করা যায় তা এখানে বিস্তারিত আলোচনা করা হবে।


1. Unit Testing (ইউনিট টেস্টিং)

Unit Testing হল একটি সফটওয়্যার টেস্টিং পদ্ধতি যেখানে একটি ছোট অংশ বা ইউনিট (যেমন ফাংশন বা মেথড) আলাদাভাবে টেস্ট করা হয়। ইউনিট টেস্টিং মূলত কোডের প্রত্যেকটি ছোট অংশ সঠিকভাবে কাজ করছে কিনা তা যাচাই করে। এটি সাধারণত স্বতন্ত্রভাবে কাজ করা মেথড, ফাংশন বা ক্লাসের জন্য ব্যবহৃত হয়।

Unit Testing এর উদ্দেশ্য:

  • Individual Code Validation: কোডের প্রতিটি অংশের কার্যকারিতা পরীক্ষা করা।
  • Error Detection: কোডের ভুল এবং অপ্রত্যাশিত আচরণ চিহ্নিত করা।
  • Faster Debugging: কোনো সমস্যা হলে দ্রুত তা খুঁজে বের করা।

Unit Testing এর উপকারিতা:

  • Early Bug Detection: কোড লেখা শুরু করার পরই ত্রুটি খুঁজে বের করা সম্ভব।
  • Code Refactoring: কোড পুনরায় লেখা (Refactor) করার পর সঠিকভাবে কাজ করছে কিনা তা যাচাই করা।
  • Regression Testing: আগের ফিচারের কার্যকারিতা বজায় রেখে নতুন ফিচার যোগ করা।

Unit Testing Angular-এ:

Angular প্রজেক্টে Unit Testing করতে, আমরা সাধারণত Jasmine (টেস্ট ফ্রেমওয়ার্ক) এবং Karma (টেস্ট রানার) ব্যবহার করি। এগুলো Angular CLI-তে ডিফল্টভাবে কনফিগার করা থাকে।

Unit Test Example in Angular:

ধরা যাক, একটি সিম্পল ফাংশন রয়েছে যা দুটি সংখ্যার যোগফল বের করে:

// sum.service.ts
export class SumService {
  add(a: number, b: number): number {
    return a + b;
  }
}

এখন এই add() মেথডটির জন্য একটি ইউনিট টেস্ট লিখি:

// sum.service.spec.ts
import { TestBed } from '@angular/core/testing';
import { SumService } from './sum.service';

describe('SumService', () => {
  let service: SumService;

  beforeEach(() => {
    TestBed.configureTestingModule({});
    service = TestBed.inject(SumService);
  });

  it('should be created', () => {
    expect(service).toBeTruthy();
  });

  it('should add two numbers correctly', () => {
    expect(service.add(2, 3)).toBe(5);
    expect(service.add(-1, 1)).toBe(0);
    expect(service.add(0, 0)).toBe(0);
  });
});

এখানে:

  • beforeEach(): টেস্ট রান করার আগে SumService তৈরি করা হচ্ছে।
  • it(): টেস্ট কেস যা add() মেথডের কার্যকারিতা পরীক্ষা করছে।

2. Integration Testing (ইন্টিগ্রেশন টেস্টিং)

Integration Testing হল টেস্টিং পদ্ধতি যেখানে বিভিন্ন ইউনিট বা মডিউল একত্রে টেস্ট করা হয়, অর্থাৎ একাধিক অংশকে একত্রে পরীক্ষা করা হয় যাতে তারা সঠিকভাবে একে অপরের সাথে কাজ করছে কিনা তা নিশ্চিত করা যায়। এটি Unit Testing এর পরবর্তী ধাপ, যেখানে প্রতিটি ইউনিট একে অপরের সাথে ইন্টিগ্রেট হয়ে কাজ করতে পারে।

Integration Testing এর উদ্দেশ্য:

  • Interaction between Units: বিভিন্ন ইউনিট বা সিস্টেমের মধ্যে ইন্টারঅ্যাকশন পরীক্ষা করা।
  • Data Flow: বিভিন্ন মডিউলের মধ্যে ডেটা সঠিকভাবে প্রবাহিত হচ্ছে কিনা তা যাচাই করা।

Integration Testing এর উপকারিতা:

  • Detecting Issues between Modules: একাধিক মডিউলের মধ্যে কোনো সমস্যা থাকলে তা চিহ্নিত করা।
  • Ensures Proper Workflow: ইউনিটগুলি একে অপরের সাথে সঠিকভাবে কাজ করছে কিনা তা যাচাই করা।

Integration Testing Angular-এ:

Angular অ্যাপ্লিকেশনে Integration Testing করা হয় সাধারণত পুরো কম্পোনেন্ট বা সার্ভিসের কার্যকারিতা পরীক্ষা করে। এখানে আমরা HttpClient এবং HttpTestingController ব্যবহার করে API কলের ইন্টিগ্রেশন টেস্ট লিখব।

Integration Test Example in Angular:

ধরা যাক, একটি সিম্পল সার্ভিস রয়েছে যা API থেকে ডেটা ফেচ করে:

// data.service.ts
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Observable } from 'rxjs';

@Injectable({
  providedIn: 'root'
})
export class DataService {
  constructor(private http: HttpClient) {}

  getData(): Observable<any> {
    return this.http.get('https://api.example.com/data');
  }
}

এখন, এই সার্ভিসের জন্য একটি ইন্টিগ্রেশন টেস্ট লিখি যেখানে আমরা HTTP কল এবং তার রেসপন্স যাচাই করব:

// data.service.spec.ts
import { TestBed } from '@angular/core/testing';
import { HttpClientTestingModule, HttpTestingController } from '@angular/common/http/testing';
import { DataService } from './data.service';

describe('DataService', () => {
  let service: DataService;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      imports: [HttpClientTestingModule],
      providers: [DataService]
    });
    service = TestBed.inject(DataService);
    httpMock = TestBed.inject(HttpTestingController);
  });

  it('should fetch data from the API', () => {
    const mockData = { id: 1, name: 'Test' };

    service.getData().subscribe(data => {
      expect(data).toEqual(mockData);
    });

    const req = httpMock.expectOne('https://api.example.com/data');
    expect(req.request.method).toBe('GET');
    req.flush(mockData);  // Simulate API response
  });

  afterEach(() => {
    httpMock.verify();  // Ensure no outstanding HTTP requests
  });
});

এখানে:

  • HttpClientTestingModule: HTTP রিকোয়েস্ট মক করার জন্য ব্যবহার করা হয়।
  • HttpTestingController: HTTP রিকোয়েস্ট এবং রেসপন্সের মক নিয়ন্ত্রণ করে।

Unit Testing এবং Integration Testing এর মধ্যে পার্থক্য:

Unit TestingIntegration Testing
ছোট অংশ (ফাংশন, মেথড, ক্লাস) পরীক্ষা করা হয়।একাধিক ইউনিট বা মডিউল একত্রে পরীক্ষা করা হয়।
সাধারণত মক ডেটা ব্যবহার করা হয়।বাহ্যিক সার্ভিস বা ডেটাবেসের সাথে কাজ করা হয়।
দ্রুত রান হয় এবং দ্রুত সমস্যা খুঁজে বের করা যায়।সময়সাপেক্ষ এবং বৃহত্তর পরীক্ষার অংশ।
শুধুমাত্র একটি ইউনিটের কার্যকারিতা যাচাই করা হয়।বিভিন্ন ইউনিটের একত্রিত কার্যকারিতা যাচাই করা হয়।

সারাংশ

Unit Testing এবং Integration Testing সফটওয়্যার টেস্টিংয়ের দুটি গুরুত্বপূর্ণ ধাপ। Unit Testing কোডের ছোট অংশ (ফাংশন বা মেথড) পরীক্ষা করে, আর Integration Testing একাধিক অংশ একত্রে কাজ করছে কিনা তা পরীক্ষা করে। Angular অ্যাপ্লিকেশনে Jasmine এবং Karma ব্যবহার করে ইউনিট টেস্টিং করা হয়, এবং HttpTestingController ব্যবহার করে ইন্টিগ্রেশন টেস্টিং করা হয়। দুটি টেস্টিং পদ্ধতি সফটওয়্যার ডেভেলপমেন্টের গুণগত মান এবং কার্যকারিতা নিশ্চিত করতে সাহায্য করে।

Content added By
Promotion